/*
 * IndiceLineal.h
 *
 * Indice simple lineal
 *
 *  Created on: 13/10/2009
 *      Author: andres
 */

#ifndef INDICELINEAL_H_
#define INDICELINEAL_H_

#include "EstrategiaIndice.h"
#include "../../classes/PrimaryKey.h"
#include "../../classes/SecondaryKey.h"
#include "DatoIndice.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#include "../Indice.inc.h"

using namespace std;





class IndiceLineal: public EstrategiaIndice
{
public:

	/**
	  * Constructor Indice Primario
	  *
	  * Crea un Indice primario a con el key indicado
	  * tira IndexException si la key es NULL
	  *
	  * @author andres
	  *
	  * @param PrymaryKey* primary key del dato a indexar
	  *
	  */
	IndiceLineal(PrimaryKey* primaryKey) throw(IndexException);

	/**
	  * Constructor Indice Secundario
	  *
	  * Crea un indice Secundario a partir del indice secundario dado
	  * tira IndexException si las key o el indice es NULL
	  *
	  * @author andres
	  *
	  * @param SecundaryKey* key que se utiliza en el indice
	  *
	  * @param PrimaryKey* key para buscar en el indice primario
	  *
	  * @param EstrategiaIndice* Indice primario en el cual buscar
	  *
	  */
	IndiceLineal(PrimaryKey* PrimaryKey, SecondaryKey* secundaryKey, EstrategiaIndice* indicePrimario) throw(IndexException);

	virtual ~IndiceLineal();


	/**
	  * Cargar
	  *
	  * Carga el dato en el indice
	  *
	  * En caso de indice primario si el identificador esta repetido
	  * tira IndexException
	  *
	  * @author andres
	  *
	  * @param void* dato serializado a agregar en el indice
	  *
	  * @param int id en que esta guardado el dato
	  *
	  */
	void Cargar(char* datoSerializadoACargar, unsigned int id) throw(IndexException);

	/**
	  * Buscar
	  *
	  * Busca todos los datos indexados con la clave dada
	  *
	  * @author andres
	  *
	  * @param std::string clave que se busca en el indice
	  *
	  * @return std::vector<int> vector con los id de los resultados encontrados
	  *
	  */
	std::vector<unsigned int> Buscar(std::string claveABuscar);

	/**
	  * Listar
	  *
	  * Busca todos los datos contenidos entre las claves dadas
	  *
	  * @author andres
	  *
	  * @param claveInicial clave incial desde la que busca los datos
	  *
	  * @param claveFinal clave final hasta la que busca los datos
	  *
	  * @return std::vector<int> vector con todos los id de los datos encontrados
	  *
	  */
	std::vector<unsigned int> Listar(std::string claveInicial, std::string claveFinal);

	/**
	  * Modificar
	  *
	  * cambia los datos en el indice
	  *
	  * @author andres
	  *
	  * @param DatoSerializadoSinModificar datos serializados sin modificar
	  *
	  * @param DatosSerializadoModificado datos serializados modificados
	  *
	  * @param idModificado id de los datos modificados
	  *
	  */
	void Modificar(char* DatoSerializadoSinModificar, char* DatoSerializadoModificado, unsigned int idModificado);

	/**
	  * Eliminar
	  *
	  * Elimina el dato del indice
	  *
	  * @author andres
	  *
	  * @param DatoSeralizadoAEliminar
	  *
	  */
	void Eliminar(char* DatoSerializadoAEliminar);

private:

	void Redimencionar(int nuevoTamanio);

	int GetTamanioBloque();

	char* informacion;
	int CantidadBloquesReservados;
	int CantidadBloquesUsados;
	DatoIndice* dato;
};

#endif /* IndiceLineal_H_ */
